package corejava.extend;

import corejava.extend.InterfaceA;
import corejava.extend.ParentA;


public class SubClassB extends ParentA implements InterfaceA {
	
	private String sub;
	public String getSub() {
		return sub;
	}
	public void setSub(String sub) {
		this.sub = sub;
	}
	public SubClassB() {
		this.sub = "SubClassB";
	}
	
	//实现接口的方法doIt，并打印自己的属性值sub
	//当父类引用(interface)指向子类对象时，该引用调用say方法，能否打印子类对象的属性值sub呢？
	public void doIt() {
		System.out.println("Implement InterfaceA 's Method doIt !"+" and sub = "+sub);

	}
	
	//重写父类的say方法，并打印自己的属性值sub
	//当父类引用(class)指向子类对象时，该引用调用say方法，能否打印子类对象的属性值sub呢？
	public void say() {
		System.out.println("Override ParentA 's Method say() !"+ " and sub = "+sub);
	}
	
	public void doMyjob() {
		System.out.println("Only me has this method !");
	}
	/**
	 * 
	 * @return
	 */
	public ParentA getSubClassB() {
		SubClassB subClassB = new SubClassB();
		subClassB.setSub("hehe");
		return subClassB;
	}
	
	public InterfaceA getSubClassB2() {
		SubClassB subClassB = new SubClassB();
		subClassB.setSub("hehe");
//		InterfaceA subClassB = new SubClassB();
//		((SubClassB)subClassB).setSub("hehe");
		return subClassB;
	}
	
	//入口函数
	public static void main(String[] args) {
		//父类引用(class)指向子类对象
		ParentA parentA = new SubClassB();
		
		//父类引用(interface)指向子类对象
		InterfaceA interfaceA = new SubClassB();
		
		SubClassB subClassB = new SubClassB();
		
		//该引用不能调用子类中有，而父类没有的方法，所以这里不能调用parentA.doIt()
		
		parentA.say(); //多态
		parentA.each();
		
		//父类引用interfaceA也只能调用子类中实现了的其接口中的方法，在该方法的作用域类可以访问子类的属性值
		interfaceA.doIt();
		//interfaceA.doMyjob(); //interfaceA不能调用其他方法
		
		
		//
		subClassB.doIt();
		subClassB.doMyjob();
		
		//当父类的方法被子类重写了后，不管是指向子类对象的父类引用，还是子类类型的引用，他们调用的都是子类中的被重写了的方法；前者即多态
		subClassB.say();
		
		//子类本身没有重写该方法，所以其继承了父类的each方法
		subClassB.each();
		
		//通过公有方法访问私有域
		System.out.println(parentA.getParentD());
	}
}
